'use client'; import { useState, useEffect } from 'react'; import { fetchApi } from '@/lib/utils/client'; import './donation-modal.scss'; type CrewMemberInfo = { crewMemberID: number; nickname: string; thumb: string|null; channelName: string|null; }; type ActiveCrew = { crewSessionID: number; title: string; crewName: string; members: CrewMemberInfo[]; }|null; type Props = { channelSID: string; onClose: () => void; }; export default function DonationModal({ channelSID, onClose }: Props) { const [amount, setAmount] = useState(1000); const [message, setMessage] = useState(''); const [sendName, setSendName] = useState(''); const [activeCrew, setActiveCrew] = useState(null); const [selectedMember, setSelectedMember] = useState(null); const [sending, setSending] = useState(false); const [done, setDone] = useState(false); const presetAmounts = [1000, 3000, 5000, 10000, 30000, 50000]; useEffect(() => { // 활성 크루 세션 조회 fetchApi(`/api/donation/crew/active/${channelSID}`) .then(res => { if (res.data) setActiveCrew(res.data); }) .catch(() => {}); }, [channelSID]); const handleSend = async () => { if (amount < 1000) { alert('최소 후원 금액은 1,000원입니다.'); return; } if (!sendName.trim()) { alert('보내는 사람 이름을 입력해 주세요.'); return; } setSending(true); try { const body: Record = { channelSID, amount, message: message || null, sendName: sendName.trim() }; if (activeCrew && selectedMember) { body.crewSessionID = activeCrew.crewSessionID; body.crewMemberID = selectedMember; } await fetchApi('/api/donation/send', { method: 'POST', body }); setDone(true); } catch (err: unknown) { alert(err instanceof Error ? err.message : '후원에 실패했습니다.'); } finally { setSending(false); } }; if (done) { return (
🎉

{amount.toLocaleString()}원 후원 완료!

); } return (

후원하기

{/* 보내는 사람 */}
setSendName(e.target.value)} placeholder="보내는 사람" maxLength={20} />
{/* 금액 */}
{presetAmounts.map(a => ( ))}
setAmount(Number(e.target.value))} />
{/* 메시지 */}